//
//  LinkListWithoutHeaderNode.cpp
//  LinkListDemo
//
//  Created by 李禹 on 15/5/31.
//  Copyright (c) 2015年 dayu. All rights reserved.
//

#include "LinkListWithoutHeaderNode.h"

void InitList(LinkList &L) {
    L = NULL;
}

void ClearList(LinkList &L) {
    LinkList p;
    while (L) {
        p = L;
        L = L->next;
        free(p);
    }
}

Status ListEmpty(LinkList &L) {
    return L == NULL;
}

int ListLength(LinkList L) {
    LinkList p = L;
    int length = 0;
    while (p) {
        length++;
        p = p->next;
    }
    return length;
}

Status GetElem(LinkList L, int i, ElemType &e) {
    LinkList p = L;
    int j = 1;
    if (i < 1) {
        return ERROR;
    }
    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (p && j == i) {
        e = p->data;
        return OK;
    }
    return ERROR;
}

int LocationElem(LinkList L, ElemType e, Status(* compare)(ElemType, ElemType)) {
    LinkList p = L;
    int j = 1;
    while (p) {
        if (compare(p->data, e)) {
            return j;
        }
        j++;
        p = p->next;
    }
    return 0;
}

Status ProiorElem(LinkList L, ElemType cur_e, ElemType &pre_e) {
    LinkList q, p = L;
    while (p->next) {
        q = p->next;
        if (q->data == cur_e) {
            pre_e = p->data;
            return OK;
        }
        p = q;
    }
    return ERROR;
}

Status NextElem(LinkList L, ElemType cur_e, ElemType &next_e) {
    LinkList p = L;
    while (p->next) {
        if (p->data == cur_e) {
            next_e = p->next->data;
            return OK;
        }
        p = p->next;
    }
    return ERROR;
}

Status ListInsert(LinkList &L, int i, ElemType e) {
    if (i < 1) {
        return ERROR;
    }
    LinkList s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    if (i == 1) {
        s->next = L;
        L = s;
    }else {
        LinkList p = L;
        int j = 1;
        while (p && j < i-1) {
            p = p->next;
            j++;
        }
        if (!p) {
            return ERROR;
        }
        s->next = p->next;
        p->next = s;
    }
    return OK;
}

Status ListDelete(LinkList &L, int i, ElemType &e) {
    if (i < 1) {
        return ERROR;
    }
    LinkList p = L;
    if (i == 1) {
        L = L->next;
        e = L->data;
        free(p);
    }else {
        int j = 1;
        LinkList q;
        while (p && j < i-1) {
            p = p->next;
            j++;
        }
        if (!p && j > i-1) {
            return ERROR;
        }
        q = p->next;
        p->next = q->next;
        e = q->data;
        free(q);
    }
    return OK;
}

void ListTraverse(LinkList L, void(* visit)(ElemType &)) {
    LinkList p = L;
    while (p) {
        visit(p->data);
        p = p->next;
        printf(" ");
    }
    printf("\n");
}

void ReveserList(LinkList &L) {
    LinkList p = L, s;
    while (p && p->next) {
        s = p->next->next;
        p->next->next = L;
        L = p->next;
        p->next = s;
    }
}